package com.atguigu.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * Date:2020/9/24
 * Author:ybc
 * Description:
 */
public class ProxyUtils {

    private Object object;

    public ProxyUtils(Object object) {
        this.object = object;
    }

    public Object getProxy(){

        /**
         * 第一个参数：类加载器，加载动态生成的代理对象
         * 第二个参数：目标对象所实现的所有接口的class对象，代理对象和目标对象要实现相同的接口
         * 第三个参数：对目标对象所实现的所有的接口中的抽象方法的重写方式
         *
         */
        ClassLoader classLoader = object.getClass().getClassLoader();
        Class<?>[] interfaces = object.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("方法："+method.getName()+",参数："+ Arrays.toString(args));
                //目标对象实现功能的过程
                Object result = null;
                try {
                    result = method.invoke(object, args);
                    System.out.println("结果："+result);
                } catch (Exception e) {
                    System.out.println("出现异常");
                    e.printStackTrace();
                } finally {
                    System.out.println("finally...");
                }

                return result;
            }
        };

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
